/*!
 *file name : i2c_lib.c
 *author :hu
 *
 *description:模拟I2C模块
 */
#include "my_i2c.h"

/*!
 *
 *说明:起始位
 *参数：
 *
 */
void i2cStart(I2COperation *cfg)
{
    cfg->setSDA(1);		
    cfg->delay(5);	
    cfg->setSCL(1);	
    cfg->delay(5);	
    cfg->setSDA(0);	
    cfg->delay(5);	
    cfg->setSCL(0);	
    cfg->delay(5);
}
/*!
 *
 *说明:停止位
 *参数：
 *
 */
void i2cStop(I2COperation *cfg)
{
	cfg->setSCL(0);
	cfg->delay(5); 
	cfg->setSDA(0);
	cfg->delay(5); 
	cfg->setSCL(1);
	cfg->delay(5);
	cfg->setSDA(1);
}
/*!
 *
 *说明:发送一个位
 *参数：
 *
 */
static void i2cSendBit(I2COperation *cfg,UINT8 bitOut)
{
	if(bitOut==0)
	{
		cfg->setSDA(0);
	}
	else
	{
		cfg->setSDA(1);
	}
	cfg->delay(2); 				
	cfg->setSCL(1);			
	cfg->delay(6); 	
	cfg->setSCL(0);	
	cfg->delay(3);
	return;
}
/*!
 *
 *说明:读取一个位
 *参数：
 *
 */
 static UINT8 i2cReceiveBit(I2COperation *cfg)
{
	UINT8 ackBit;

	cfg->setSDA(1);		  
	cfg->delay(2); 		
	cfg->setSCL(1);	

	cfg->delay(5); 	
	
	cfg->setDir(0);
	if (cfg->getSDALevel())
	{
		ackBit=1;
	}
	else
	{
		ackBit=0;
	}
	cfg->setDir(1);
	cfg->setSCL(0);		
	cfg->delay(3);

	return	ackBit;
}

/*!
 *
 *说明：发送一个字节
 *参数：byteData:待发送的字节
 *返回值：0有应答 1无应答
 */
UINT8 i2cSendByte(I2COperation *cfg,UINT8 byteData)
{
	UINT8 bitCnt;
	UINT8 ackBit;
	UINT8 bitOut;

	for(bitCnt=8; bitCnt; bitCnt--)
	{
		if (byteData&0x80)
		{
			bitOut=1;	
		}
		else
		{
			bitOut=0;	
		}
		i2cSendBit(cfg,bitOut);		
		byteData<<=1;				
	}
	ackBit=i2cReceiveBit(cfg); 	
	return	ackBit;
}

/*!
 *
 *说明：读取一个字节
 *参数：ackNack：0应答 1不应答
 *返回值：读取到的字节
 */
UINT8 i2cReceiveByte(I2COperation *cfg,UINT8 ackBit)
{
	UINT8 byteData;
	UINT8 bitCnt;

	for(bitCnt=8; bitCnt; bitCnt--)
	{
		if(i2cReceiveBit(cfg))	
		{
			byteData <<= 1;	
			byteData |=0x01;
		}
		else
		{
			byteData <<= 1;		
			byteData &=0xfe;
		}
	}
	i2cSendBit(cfg,ackBit);	
	return byteData;
}
